#include "app_message.h"
#include "app_common.h"
#include "cJSON.h"
#include "string.h"
#include <stdlib.h>


/**
 * @brief 把字节数组转换为json
 * @param bytes_data 字节数组
 * @param bytes_data_len 字节数组长度
 * @return 转换后的json字符串
 * 
 *  1 从字节数组中提取元素值  1 conntype 2 id  3 msg
 *  2 把 id 和 msg 字节数组 转换 为 16进制字符串 
 *  3  cjson转换为json字符串
 */
char *app_message_bytes_to_json(char *bytes_data, int bytes_data_len)
{

    // *  1 从字节数组中提取元素值  1 conntype 2 id  3 msg
     int conn_type= bytes_data[0];
     int id_len= bytes_data[1];
     int msg_len= bytes_data[2];
    
     char id_str[id_len];
     memcpy(id_str, bytes_data+3, id_len);

     char msg_str[msg_len];
     memcpy(msg_str, bytes_data+3+id_len, msg_len);  


    // *  2 把 id 和 msg 字节数组 转换 为 16进制字符串 
    char *id_hexstr=app_common_bytes_to_hexstr(id_str, id_len);
    char *msg_hexstr=app_common_bytes_to_hexstr(msg_str, msg_len);


    // *  3  cjson转换为json字符串
     cJSON *root = cJSON_CreateObject(); 
     cJSON_AddNumberToObject(root, "conn_type", conn_type);
     cJSON_AddStringToObject(root, "id", id_hexstr);
     cJSON_AddStringToObject(root, "msg", msg_hexstr);
     char *json_str = cJSON_PrintUnformatted(root);

     // 4 释放内存
     cJSON_Delete(root);
     free(id_hexstr);
     free(msg_hexstr);

     return json_str;
}


/**
 * @brief 把json 转换为字节数组
 * @param json_data json字符串
 * @param bytes_buff 字节数组容器
 * @param buff_len 字节数组容器长度
 * @return 转换后的字节数组长度
 *  //1  利用cjson把json中的元素值提取出来   conn_type id msg
    //2  把id和msg 16进制字符串转换为字节数组
    //3  把 conn_type id msg 拼接起来，并把字节数组拷贝到bytes_buff中
 */
int app_message_json_to_bytes(char *json_data,  char *bytes_buff ,int buff_len)
{
    //1  利用cjson把json中的元素值提取出来   conn_type id msg
    cJSON *root = cJSON_Parse(json_data);
    cJSON *conn_type_cjson= cJSON_GetObjectItem(root, "conn_type");
    cJSON *id_cjson= cJSON_GetObjectItem(root, "id");
    cJSON *msg_cjson= cJSON_GetObjectItem(root, "msg");

    int conn_type= conn_type_cjson->valueint;
    char *id_hexstr= id_cjson->valuestring;
    char *msg_hexstr= msg_cjson->valuestring;

    int id_len= strlen(id_hexstr)/2;
    int msg_len= strlen(msg_hexstr)/2;

    char id_str[id_len];
    char msg_str[msg_len];

    //2  把id和msg 16进制字符串转换为字节数组
    id_len= app_common_hexstr_to_bytes(id_hexstr,id_str,id_len);
    msg_len= app_common_hexstr_to_bytes(msg_hexstr,msg_str,msg_len);
    //3  把 conn_type id msg 拼接起来，并把字节数组拷贝到bytes_buff中
    bytes_buff[0]= conn_type; 
    bytes_buff[1]= id_len;
    bytes_buff[2]= msg_len;
    memcpy(bytes_buff+3, id_str, id_len); //id
    memcpy(bytes_buff+3+id_len, msg_str, msg_len); //msg

    return 3+id_len+msg_len;
}

